#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx1, mtx2;

// 1. 构建死锁
// void func1() {
//     for (int i = 0; i < 1000000; i++) {
//         mtx1.lock();
//         mtx2.lock();
//         mtx1.unlock();
//         mtx2.unlock();
//         std::cout << "func1: " << i << std::endl;
//     }
// }

// void func2() {
//     for (int i = 0; i < 1000000; i++) {
//         mtx2.lock();
//         mtx1.lock();
//         mtx1.unlock();
//         mtx2.unlock();
//         std::cout << "func2: " << i << std::endl;
//     }
// }


// 2. 解决方案
void func1() {
    for (int i = 0; i < 1000000; i++) {
        mtx1.lock();  // 同时先获取mtx1
        mtx2.lock();
        mtx1.unlock();
        mtx2.unlock();
        std::cout << "func1: " << i << std::endl;
    }
}

void func2() {
    for (int i = 0; i < 1000000; i++) {
        mtx1.lock();   // 同时先获取mtx1
        mtx2.lock();
        mtx1.unlock();
        mtx2.unlock();
        std::cout << "func2: " << i << std::endl;
    }
}

int main() {
    std::thread t1(func1);
    std::thread t2(func2);

    t1.join();
    t2.join();

    std::cout << "over..." << std::endl;

    return 0;
}